import preference from '@ohos.data.preferences'

/**
 * 简单存储
 */
export class SpUtils {
  private tag: string = 'SpUtils'
  private static mInstance: SpUtils
  private defPreName: string = 'mySpUtils'
  private prefMap: Map<string, preference.Preferences> = new Map()

  private constructor() {
  }

  static getInstance() {
    if (!SpUtils.mInstance) {
      SpUtils.mInstance = new SpUtils()
    }
    return SpUtils.mInstance
  }

  /**
   * 初始化
   * @param context
   * @param name
   */
  init(context, name: string = this.defPreName) {
    preference.getPreferences(context, name).then(pref => {
      this.prefMap.set(name, pref)
      console.debug(this.tag, 'init SpUtils ' + name + ' success')
    }).catch(err => {
      console.debug(this.tag, 'init SpUtils ' + name + ' error ' + JSON.stringify(err))
    })
  }

  /**
   * 保存数据
   * @param name
   * @param key
   * @param value
   */
  put(key: string, value: preference.ValueType, name: string = this.defPreName) {
    if (!this.prefMap.has(name)) {
      console.debug(this.tag, name + ' not init')
      return
    }
    let pref = this.prefMap.get(name)
    pref.put(key, value)
    pref.flush().then(() => {
      console.debug(this.tag, key + ' save success')
    }).catch(err => {
      console.debug(this.tag, JSON.stringify(err))
    })
  }

  async getString(key: string, defaultValue: string = '', name: string = this.defPreName) {
    if (!this.prefMap.has(name)) {
      console.debug(this.tag, name + ' not init')
      return
    }
    try {
      let pref = this.prefMap.get(name)
      await pref.get(key, defaultValue)
      console.debug(this.tag, key + ' get success')
    } catch (e) {
      console.debug(this.tag, JSON.stringify(e))
    }
  }

  async getNumber(key: string, defaultValue: number = -1, name: string = this.defPreName) {
    if (!this.prefMap.has(name)) {
      console.debug(this.tag, name + ' not init')
      return
    }
    try {
      let pref = this.prefMap.get(name)
      await pref.get(key, defaultValue)
      console.debug(this.tag, key + ' get success')
    } catch (e) {
      console.debug(this.tag, JSON.stringify(e))
    }
  }

  async getBoolean(key: string, defaultValue: boolean = false, name: string = this.defPreName) {
    if (!this.prefMap.has(name)) {
      console.debug(this.tag, name + ' not init')
      return
    }
    try {
      let pref = this.prefMap.get(name)
      await pref.get(key, defaultValue)
      console.debug(this.tag, key + ' get success')
    } catch (e) {
      console.debug(this.tag, JSON.stringify(e))
    }
  }

  async getArrayString(key: string, defaultValue: Array<string> = null, name: string = this.defPreName) {
    if (!this.prefMap.has(name)) {
      console.debug(this.tag, name + ' not init')
      return
    }
    try {
      let pref = this.prefMap.get(name)
      await pref.get(key, defaultValue)
      console.debug(this.tag, key + ' get success')
    } catch (e) {
      console.debug(this.tag, JSON.stringify(e))
    }
  }

  async getArrayNumber(key: string, defaultValue: Array<number> = null, name: string = this.defPreName) {
    if (!this.prefMap.has(name)) {
      console.debug(this.tag, name + ' not init')
      return
    }
    try {
      let pref = this.prefMap.get(name)
      await pref.get(key, defaultValue)
      console.debug(this.tag, key + ' get success')
    } catch (e) {
      console.debug(this.tag, JSON.stringify(e))
    }
  }

  async getArrayBoolean(key: string, defaultValue: Array<boolean> = null, name: string = this.defPreName) {
    if (!this.prefMap.has(name)) {
      console.debug(this.tag, name + ' not init')
      return
    }
    try {
      let pref = this.prefMap.get(name)
      await pref.get(key, defaultValue)
      console.debug(this.tag, key + ' get success')
    } catch (e) {
      console.debug(this.tag, JSON.stringify(e))
    }
  }

  delete(key: string, name: string = this.defPreName) {
    if (!this.prefMap.has(name)) {
      console.debug(this.tag, name + ' not init')
      return
    }
    let pref = this.prefMap.get(name)
    pref.delete(key).then(() => {
      console.debug(this.tag, key + ' delete success')
    }).catch(err => {
      console.debug(this.tag, JSON.stringify(err))
    })
  }

  async hasKey(key: string, name: string = this.defPreName) {
    if (!name) {
      console.debug(this.tag, name + ' not init')
      return
    }
    try {
      let pref = this.prefMap.get(name)
      let has = await pref.has(key)
      console.debug(this.tag, (has === true ? 'has ' : 'not ') + key)
    } catch (e) {
      console.debug(this.tag, JSON.stringify(e))
    }
  }

  clearAll(name: string = this.defPreName) {
    if (!name) {
      console.debug(this.tag, name + ' not init')
      return
    }
    let pref = this.prefMap.get(name)
    pref.clear().then(() => {
      console.debug(this.tag, 'clearAll success')
    }).catch(err => {
      console.debug(this.tag, JSON.stringify(err))
    })
  }
}